package utils

import (
	"go.uber.org/zap"
	"os"
	"path/filepath"

	"reflect"
	"runtime"
	"strings"
)

// 获取指定目录及所有子目录下的所有文件，可以匹配后缀过滤。
func WalkDir(dirPth string, suffix []string) (_files []string, _err error) {
	ok, _ := pathExists(dirPth, true) //不存在就建立
	if !ok {
		zap.S().Debugf("目录不存在:%s", dirPth)
		return
	}
	_files = make([]string, 0, 30)
	for i := 0; i < len(suffix); i++ {
		suffix[i] = strings.ToUpper(suffix[i]) //忽略后缀匹配的大小写
	}
	_err = filepath.Walk(dirPth, func(filename string, fi os.FileInfo, err error) error { //遍历目录
		if err != nil {
			zap.S().Errorf("遍历目录 错误:%v", err)
		}
		if fi.IsDir() { // 忽略目录
			return nil
		}
		for _, v := range suffix {
			if strings.HasSuffix(strings.ToUpper(fi.Name()), v) {
				_files = append(_files, filename)
				break
			}
		}
		return nil
	})
	return
}

// 检测文件夹路径时候存在
func pathExists(path string, is_create bool) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		if is_create {
			if err = os.MkdirAll(path, os.ModePerm); err == nil {
				return true, nil
			}
		}
		return false, err
	}
	return false, err
}

// 获取函数名称
func GetFuncName(i interface{}, seps ...rune) string {
	fn := runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()
	// 用 seps 进行分割
	fields := strings.FieldsFunc(fn, func(sep rune) bool {
		for _, s := range seps {
			if sep == s {
				return true
			}
		}
		return false
	})
	if size := len(fields); size > 0 {
		return fields[size-1]
	}
	return ""
}
